package com.chisheng.caa.validator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * 参数值校验注解。通过判断参数的取值是否存在于 beanClass#methodName() 返回的集合中确定参数是否有效。
 * 即存在集合中有效，不存在集合中无效。不对 null 值进行校验。
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(validatedBy = ContainsValidator.class)
public @interface Contains {

    /**
     * 实例 Bean 的类型，指定的 Bean 必须存在容器中。beanClass 和 beanName 必须有一个有效，也可以同时指定，起到同时限定。
     */
    Class<?>[] beanClass() default Void.class;

    /**
     * 实例 Bean 的名称，指定的 Bean 必须存在容器中。beanClass 和 beanName 必须有一个有效，也可以同时指定，起到同时限定。
     */
    String[] beanName() default "";

    /**
     * 校验的方法名称，方法必须返回一个 Collection<?> 类型实例。当 bean 是 @FunctionalInterface 接口时，可不用指定此参数。
     */
    String[] methodName() default "";

    /**
     * 校验失败时传递的错误消息
     */
    String message() default "{Contains.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}
